/**
 * 顺序结构循环队列泛型类
 * @param <T>
 */
public class sequenQueue<T> {
    final int MaxSize=10;
    private T queueArray[];
    private int front,rear;
//  初始化
    public sequenQueue()
    {
        front=rear=0;
        queueArray=(T[])new Object[MaxSize];
    }
//  在队列的队尾插入一个新元素
    public void EnQueue(T obj)
    {
        if ((rear+1)%queueArray.length==front){
            T[] p = (T[]) new Object[queueArray.length*2];
            if (rear == ((T[])queueArray).length-1){
                for (int i=1;i<rear;i++){
                    p[i]=queueArray[i];
                }
            }
            else {
                int i,j=1;
                for (i = front+1; i < queueArray.length; i++,j++){
                    p[j]=queueArray[i];
                }
                for (i = 0; i < rear; i++,j++){
                    p[j]=queueArray[i];
                }
                front=0;
                rear=queueArray.length-1;
            }
            queueArray=p;
        }
        rear=(rear+1)%queueArray.length;
        queueArray[rear]=obj;
    }
//  删除队列头元素
    public T DeQueue()
    {
        if (isEmpty()){
            System.out.println("队列已空，无法出队");
            return null;
        }
        front = (front+1)%queueArray.length;
        return queueArray[front];
    }
//    获取队列头元素
    public T getHead()
    {
        if (isEmpty()){
            System.out.println("队列已空，无法出队");
            return null;
        }
        return queueArray[(front+1)%queueArray.length];
    }
//    求出队列中数据元素的个数
    public int size()
    {
        return (rear-front+queueArray.length)%queueArray.length;
    }
//    判空
    public boolean isEmpty()
    {
        return front==rear;
    }
//    依次访问队列中的每个元素
    public void nextOrder()
    {
        int i,j=front;
        for (i=1;i<=size();i++)
        {
            j=(j+1)%queueArray.length;
            System.out.println(queueArray[j]);
        }
    }
//    销毁一个已存在的队列
    public void clear()
    {
        front=rear=0;
    }
}
